package P093_erasableGeneric;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * Desc:&emsp;&ensp;泛型只在编译期有效，在运行期被清除
 *
 *
 * @author 李渊&emsp;liyuan7@yusys.com.cn
 * @version 1.0
 * 
 */
public class Foo {
    // ===== part1 ====
    public void arrayMethod(String[] strArr){
    }
    public void arrayMethod(Integer[] intArr){
    }

    // Java泛型擦除：编译后，泛型类都会做响应的转化
    // List<String>、List<Integer>、List<T>擦除后变成List
    // List<String[]>擦除后变成List[]
    // List<? extends E>、List<? super E>擦除后变成List<E>
    // List<T extends Serializable & Cloneable>擦除后变成List<Serializable>
    public void listMethod(List<String> strList){
    }
//    public void listMethod(List<Integer> intList){
//    }


    // ===== part2 ====
    // 编译前
    @Test
    public void test1() {
        List<String> list = new ArrayList<String>();
        list.add("abc");
        String str = list.get(0);
    }
    // 编译后
    @Test
    public void test2() {
        List list = new ArrayList();
        list.add("abc");
        String str = (String)list.get(0);
    }


    // ===== part3 ====
    // 1. 泛型的class对象是相同的，擦除后都是一样的
    public void test3(){
        List<String> ls = new ArrayList<String>();
        List<Integer> li = new ArrayList<Integer>();
        // 擦除后都是List
        System.out.println(ls.getClass() == li.getClass());
    }

    // 2. 泛型数组初始化时不能声明泛型类型
    // 可以声明一个带有泛型的数组，但是不能初始化
//    List<String>[] listArr1 = new List<String>[];
    List<String>[] listArr ;
    // 3 instanceof不允许存在泛型参数，因为泛型会被擦除
    public void test4(){
        List<String> list = new ArrayList<>();
//        System.out.println(list instanceof List<String>);
    }

}
